package com.atguigu.guli.service.edu.controller.admin;


import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.atguigu.guli.service.base.result.R;
import com.atguigu.guli.service.edu.entity.Teacher;
import com.atguigu.guli.service.edu.entity.query.TeacherQuery;
import com.atguigu.guli.service.edu.feign.OssFeignClient;
import com.atguigu.guli.service.edu.service.TeacherService;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * 讲师 前端控制器
 * </p>
 *
 * @author atguigu
 * @since 2021-06-23
 */
@RestController
@Api(tags = "讲师管理模块")
@RequestMapping("/admin/edu/teacher")
@Slf4j
@CrossOrigin //设置当前controller所有的接口允许跨域访问 和其他的controller无关
// 只有访问的地址+请求方式+参数 和当前controller的接口匹配时才能被他处理 允许跨域访问
//  http://localhost:8110/admin/edu/teacher/list +get
//  http://localhost:8110/admin/edu/teacher/list +post
public class AdminTeacherController {
    @Autowired
    TeacherService teacherService;
    //7、批量删除讲师 [  id  [1,2,3]]
    @DeleteMapping("batchDel")
    /*
        前端提交参数：
            1、url?ids=1,2,3
                后端：
                    String[] ids      得到一个String类型的数组，1 2 3作为数组的元素
                    @RequestParam("ids")List<String> ids   将ids的值 1 2 3存到idslist集合中
           2、url
                请求体提交的json数组： [1,2,3]
                后端：
                    @RequestBody List<String> ids
     */


//    public R batchDel(String[] ids){ // springmvc接受请求参数时，如果以ids=1,2,3的形式提交，它会自动以,进行分割 将每个元素存到数组中
//    public R batchDel(@RequestParam("ids")List<String> ids){ // springmvc接受请求参数时，如果以ids=1,2,3的形式提交，它会自动以,进行分割 将每个元素存到数组中
    public R batchDel(@RequestBody List<String> ids){ // springmvc接受请求参数时，如果以ids=1,2,3的形式提交，它会自动以,进行分割 将每个元素存到数组中
        //System.out.println(ids); // /admin/edu/teacher/batchDel?ids=1,2,3
       teacherService.removeByIds(ids);
        return R.ok();
    }

    //6、分页查询讲师集合    pageNum  pageSize
    @ApiOperation(value = "分页查询讲师")
    @GetMapping("list/{pageNum}/{pageSize}")
    public R listPage(@ApiParam("页码") @PathVariable("pageNum") Integer pageNum ,
                      @ApiParam("查询记录条数")  @PathVariable("pageSize") Integer pageSize,
//                      @RequestBody 表示获取请求体json转为对象
                      //请求参数 使用pojo或者  requestParam方式获取
                        TeacherQuery query
                      ){
        // 业务bean
        Page<Teacher> page = new Page<>(pageNum , pageSize);
        page = teacherService.getPageByCondition(page, query);
        return R.ok().data("page" , page);
    }

    //3、新增
    @ApiOperation("新增讲师")
    @PostMapping("save") // 前端post方式提交表单数据，一般使用 请求体中 使用对象json的方式提交数据
    public R saveTeacher(@ApiParam("新增讲师对象") @RequestBody Teacher teacher){
        teacherService.save(teacher);
        return R.ok();
    }

    //5、查询指定id的讲师
    @ApiOperation(value = "查询指定讲师")
    @GetMapping("get/{id}")
    public R getById(@PathVariable("id") String id){
        Teacher teacher = teacherService.getById(id);
        return R.ok().data("item" , teacher);
    }

    //4、更新
    @ApiOperation("更新讲师")
    @PutMapping("update") // 前端post方式提交表单数据，一般使用 请求体中 使用对象json的方式提交数据
    public R updateTeacher(@ApiParam("更新讲师对象") @RequestBody Teacher teacher){
        teacherService.updateById(teacher);
        return R.ok();
    }

    //1、查询所有讲师
    @ApiOperation(value = "查询所有讲师")
//    @SentinelResource(value = "资源名",  fallback = "" , fallbackClass = )
    @GetMapping("list")
    public R listAll(){
//        try {
//            TimeUnit.SECONDS.sleep(2);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        log.debug("{}级别的日志,现在是：{}" , "debug" , new Date());
        log.info("{}级别的日志,现在是：{}" , "info" , new Date());
        log.warn("{}级别的日志,现在是：{}" , "warn" , new Date());
        log.error("{}级别的日志,现在是：{}" , "error" , new Date()); //生产环境使用
        List<Teacher> list = teacherService.list();
       return R.ok().data("items" , list);
    }
    @Autowired
    OssFeignClient ossFeignClient;
    //2、删除指定id讲师
//    @Transactional
    @ApiOperation("删除指定id讲师")
    @DeleteMapping("delete/{id}")
    public R deleteById(@ApiParam(name="id", value = "用户id",defaultValue="2",required = true)
                                  @PathVariable("id") String id ){
        Teacher teacher = teacherService.getById(id);//在删除之前先查询讲师数据
        boolean b = teacherService.removeById(id);
        //讲师数据存在 数据库中 和 oss中
        //删除时 需要将两个数据都删除[优先删除数据库数据]
        //删除头像时  请求需要交给service-oss来处理
        // edu 可以远程访问 oss： ribbon openfeign(前提：远程访问的两个微服务都必须注册到注册中心)
        // httpclient
        if(b){
            //删除讲师头像
            if(!StringUtils.isEmpty(teacher.getAvatar())){
                //如果讲师有头像地址 则删除头像
                R ossR = ossFeignClient.deleteFile(teacher.getAvatar(), "avatar");
                log.error( ossR.toString() );
                //判断删除是否成功，如果不成功，抛出异常 认为头像删除失败
//                if(ossR.getCode()!=20000){
//                    throw new RuntimeException("远程删除头像失败");
//                }
            }
            return R.ok().message("删除成功");
        }else{
            return R.error().message("讲师不存在");
        }
    }

}

